package com.learn.redis.helper;

import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * @author wm
 * redisHelper接口类，预置两种实现方式:redisTemplate, redisson
 */
public interface RedisHelper {
    /**
     * 获取字符串类型数据
     *
     * @param key 查询的键
     * @return 字符串类型值
     */
    String strGet(String key);

    /**
     * 获取泛型数据
     *
     * @param key 查询的键
     * @return 泛型值
     */
    <T> T tGet(String key, Class<T> tClass);

    /**
     * 设置字符串类型值
     *
     * @param key   键
     * @param value 值
     */
    void strSet(String key, String value);

    /**
     * 设置字符串类型值，如果已经有值则不在设置
     *
     * @param key   键
     * @param value 值
     * @return 是否设置值成功，true是false否
     */
    Boolean strSetNx(String key, String value);

    /**
     * 批量设置键值对
     *
     * @param multiMap 键值对map
     */
    void mSet(Map<String, String> multiMap);

    /**
     * 批量获取值列表
     *
     * @param keyList 键列表
     * @return 值列表
     */
    List<String> mGet(List<String> keyList);

    /**
     * 值加一
     *
     * @param key 键
     */
    Long incr(String key);

    /**
     * 值减一
     *
     * @param key 键
     */
    Long decr(String key);

    /**
     * 在值后拼接字符串
     *
     * @param key       键
     * @param appendStr 拼接的字符串
     * @return 拼接后的字符串新长度
     */
    Integer append(String key, String appendStr);

    /**
     * 删除key-value
     *
     * @param key 需要删除的key
     * @return 是否删除成功
     */
    Boolean del(String key);

    /**
     * 批量删除
     *
     * @param keyList 需要删除的key列表
     * @return 删除成功的key数
     */
    Long mDel(List<String> keyList);

    /**
     * 统计value字符串长度
     *
     * @param key 键
     * @return value长度
     */
    Long strlen(String key);

    /**
     * 获取旧值设置新值，无旧值返回null
     *
     * @param key   键
     * @param value 新值
     * @return 旧值
     */
    String getSet(String key, String value);

    /**
     * 将一个值插入到列表头部
     *
     * @param key   键
     * @param value 值
     * @return 插入操作后列表的长度
     */
    Long lPush(String key, String value);

    /**
     * 将一个值插入列表尾部
     *
     * @param key   键
     * @param value 值
     * @return 插入操作后列表的长度
     */
    Long rPush(String key, String value);

    /**
     * 移除并返回列表的第一个值
     *
     * @param key 键
     * @return 被移除的值
     */
    String lPop(String key);

    /**
     * 移除并返回列表的最后一个元素
     *
     * @param key 键
     * @return 被移除的值
     */
    String rPop(String key);

    /**
     * 获取列表中指定范围的元素
     *
     * @param key        键
     * @param startIndex 开始坐标
     * @param endIndex   结束坐标,end取-1是全部
     * @return 元素列表
     */
    List<String> lRange(String key, Long startIndex, Long endIndex);

    /**
     * 向set中添加元素
     *
     * @param key    键
     * @param values 待添加的值列表
     * @return 成功添加到集合中的元素数量
     */
    Long sAdd(String key, String... values);

    /**
     * 从set中删除元素
     *
     * @param key    键
     * @param values 待删除的值列表
     * @return 成功删除的元素数量
     */
    Long sRem(String key, Object... values);

    /**
     * 获取set中的所有成员
     *
     * @param key 键
     * @return set
     */
    Set<String> sMembers(String key);

    /**
     * 获取set中的成员数
     *
     * @param key 键
     * @return set中的成员数
     */
    Long sCard(String key);

    /**
     * 将成员添加到有序集合中，并为其指定分数
     *
     * @param key    键
     * @param member 待添加的值
     * @param score  分数
     * @return 是否添加成功
     */
    Boolean zAdd(String key, String member, Double score);

    /**
     * 移除有序集合中的成员
     *
     * @param key     键
     * @param members 待移除的值列表
     * @return 从有序集合中移除的成员数量
     */
    Long zRem(String key, Object... members);

    /**
     * 获取有序集合中指定范围的成员
     *
     * @param key        键
     * @param startIndex 起始位置
     * @param endIndex   结束位置
     * @return 指定范围内的成员
     */
    Set<String> zRange(String key, Long startIndex, Long endIndex);

    /**
     * 设置哈希表中字段的值
     *
     * @param key     键
     * @param hashKey hash键
     * @param value   值
     */
    void hSet(String key, Object hashKey, Object value);

    /**
     * 获取哈希表中字段的值
     *
     * @param key     键
     * @param hashKey hash键
     * @return 值
     */
    Object hGet(String key, Object hashKey);

    /**
     * 删除哈希表中的字段
     *
     * @param key      键
     * @param hashKeys hash键列表
     * @return 成功从哈希表中删除的字段数量
     */
    Long hDel(String key, Object... hashKeys);

    /**
     * 对应key设置超时时间
     *
     * @param key      键
     * @param timeOut  超时时间
     * @param timeUnit 超时时间单位
     * @return 超时时间是否设置成功
     */
    Boolean expire(String key, Long timeOut, TimeUnit timeUnit);

    /**
     * 获取key的超时时间
     *
     * @param key      键
     * @param timeUnit 超时时间单位
     * @return 超时时间
     */
    Long ttl(String key, TimeUnit timeUnit);

    /**
     * 推送通道消息
     *
     * @param channelName 通道名
     * @param message     消息
     */
    void publish(String channelName, Object message);

}
